<?php 
class Valesalida extends AppModel{
    var $name = 'Valesalida';
    var $belongsTo = array('Estado'=>array('className' => 'Estado','foreignKey' => 'estado_id'),
                            'Valesalidaestado'=>array('className' => 'Valesalidaestado','foreignKey' => 'valesalidaestado_id'),
                            'Usuario'=>array('className' => 'Usuario','foreignKey' => 'usuarioentrega_id'),
							'Factura'=>array('className' => 'Factura','foreignKey' => 'factura_id'),
                            'Almacen'=>array('className' => 'Almacen','foreignKey' => 'almacen_id'));
	
    function countValesalida($params){return $this->find('count',$params);}
	function dataValesalida($params){return $this->find('all',$params);}
	
	/*
     * Verifica la existencia del valesalida 
     * si existe: (desactivo)? lo activa : devuelve id
     * si no existe: crea y devuelve id
     * return id
     */
	function verificarValesalida($factura_id,$almacen_id,$variables){
		App::import('Model','Serie');  $this->Serie = new Serie();
		App::import('Model','Documento');  $this->Documento = new Documento();
	    
        $conditions = array('Valesalida.factura_id'=>$factura_id, 'Valesalida.almacen_id'=>$almacen_id);
        $valesalida = $this->find('first',array('conditions'=>$conditions,'fields'=>array('Valesalida.id','Valesalida.estado_id')));
        
        
         
        if(empty($valesalida)){ //generamos el vale salida
			// pedimos la numeracion del nuevo documento 
			$respuesta = $this->Serie->actualizarNumeracion('organizacion_id', $variables['Organizacion']['id'], null,$variables['Tipodocumento']['valesalida_id']);
			
			if(!$respuesta['respuesta']) return false;

			// Generamos el documento 
			$documento = array('Documento'=>array(	'serie'=>$respuesta['serie'],
													'numero'=>$respuesta['numero'],
													'numero_serie'=>trim($respuesta['numero_serie']),
													'tipodocumento_id'=>$variables['Tipodocumento']['valesalida_id'],
													'organizacion_id'=>$variables['Organizacion']['id'],
													'usuario_id'=>$variables['Usuario']['id']));	
		  	
			// guardamos el documento que formamos 
			$this->Documento->create();
			if(!$this->Documento->save($documento['Documento']))  return false;
			
			$valesalida['Valesalida']['documento_id'] = $this->Documento->id;
			$valesalida['Valesalida']['numero']=$documento['Documento']['numero_serie'];
			$valesalida['Valesalida']['factura_id']=$factura_id;  
			$valesalida['Valesalida']['almacen_id']=$almacen_id;
			
			$this->create();
			if(!$this->save($valesalida['Valesalida'])) return false;
            
			return $this->id; 
			
        }else{//existe el vale verificamos su estado
            $valesalida['Valesalida']['valesalidaestado_id'] = 1;
            if(!$this->save($valesalida['Valesalida'])) return false;
            else return $valesalida['Valesalida']['id'];
        }
    }
    
    /** Genera el vale de salida por factura o boleta
     * return array('respuesta'=>false, 'mensaje'=>"MENSAJE");
     */
    function setValesalidaPorFactura($detallefacturas,$factura_id,$variables){
        app::import('Model','Detallevalesalida');  $this->Detallevalesalida = new Detallevalesalida();
        app::import('Model','Detallefactura');  	$this->Detallefactura = new Detallefactura();
        app::import('Model','AlmacenesArticulo');  $this->AlmacenesArticulo = new AlmacenesArticulo();
        app::import('Model','Articulo');           $this->Articulo = new Articulo();
        
        foreach($detallefacturas as $detallefactura){
			if($detallefactura['Detallefactura']['cantidad']>0){ $condetalle = true;
			    //buscamos si el vale salida existe sino se creara, nos entrega el id del vale
    			$valesalida_id = $this->verificarValesalida($factura_id,$detallefactura['Detallefactura']['almacen_id'],$variables);
    			if(!$valesalida_id) return array('respuesta'=>false, 'mensaje'=>"ERROR AL GENERAR ACTUALIZAR VALE SALIDA");
    			
    			$conditions = array('valesalida_id'=>$valesalida_id,'articulo_id'=>$detallefactura['Detallefactura']['articulo_id']);
    		    $detallevalesalida_db = $this->Detallevalesalida->find('first',array('conditions'=>$conditions,'recursive'=>-1));
    		    
    		   	//generamos-actualizamos el detallevalesalida
    		    $detallevalesalida['Detallevalesalida']['valesalida_id'] = $valesalida_id;
    		    $detallevalesalida['Detallevalesalida']['articulo_id'] = $detallefactura['Detallefactura']['articulo_id'];
    		    $detallevalesalida['Detallevalesalida']['cantidad'] = $detallefactura['Detallefactura']['cantidad'];
    		    $detallevalesalida['Detallevalesalida']['estado_id'] = 1; 
    		    
    			if(empty($detallevalesalida_db)) $this->Detallevalesalida->create();
    			
    			if(!$this->Detallevalesalida->save($detallevalesalida['Detallevalesalida']))  return array('respuesta'=>false, 'mensaje'=>"ERROR AL GUARDAR DETALLE VALE", $detallevalesalida);
    			
    			// actualizamos el detalle de factura con el id del vale salida
    			$detallefactura['Detallefactura']['valesalida_id'] = $valesalida_id;
    			if(!$this->Detallefactura->save($detallefactura['Detallefactura']))  return array('respuesta'=>false, 'mensaje'=>"ERROR AL ACTUALIZAR DETALLE FACTURA", $detallevalesalida);
    			
    			// no retira ningun stock disponible ya que se retiro al momento de generar la factura
    			unset($detallevalesalida);
			}
		}
		return empty($condetalle)?array('respuesta'=>false, 'mensaje'=>"CANTIDAD(ES) MAYORES A CERO"):array('respuesta'=>true, 'mensaje'=>"VALE GENERADO", 'Valesalida'=>array('id'=>$valesalida_id));
    }
    
    /** Genera el kardex de un vale de salida
     * $valesalida_id : id del vale salida que se va retirar sus insumos
     * return array('respuesta'=>false, 'mensaje'=>"MENSAJE");
     */
    function setKardexValesalida($valesalida_id,$variables){
        App::import('Model','Detallevalesalida');            $this->Detallevalesalida = new Detallevalesalida();
		App::import('Model','Articulo');                     $this->Articulo = new Articulo();
		App::import('Model','AlmacenesArticulo');            $this->AlmacenesArticulo = new AlmacenesArticulo();
		App::import('Model','Kardex');                       $this->Kardex = new Kardex();
		
        $conditions = array('Valesalida.id'=>$valesalida_id, 'Valesalida.estado_id'=>1);
        $valesalida = $this->find('first',array('conditions'=>$conditions,'fields'=>array('Valesalida.id','Valesalida.estado_id','Valesalida.almacen_id','Valesalida.documento_id','Valesalida.factura_id')));
        if(empty($valesalida)) array('respuesta'=>false, 'mensaje'=>"ERROR EL VALE SALIDA NO EXISTE");
        if(!($valesalida['Valesalida']['valesalidaestado_id'] == 1))  array('respuesta'=>false, 'mensaje'=>"EL VALE SALIDA YA FUE ENTREGADO");
        
        //cambiamos el estado del vale salida
        $valesalida['Valesalida']['valesalidaestado_id'] = 2;  //entregado
        $valesalida['Valesalida']['usuarioentrega_id'] = $variables['Usuario']['id'];
        if(!$this->save($valesalida['Valesalida']))  array('respuesta'=>false, 'mensaje'=>"VALE SALIDA NO ACTUALIZADO");
        
        //Generamos el kardex
        $conditions = array('Detallevalesalida.valesalida_id'=>$valesalida_id,'Detallevalesalida.estado_id'=>1);
		$detallevalesalidas_db = $this->Detallevalesalida->find('all',array('conditions'=>$conditions,'recursive'=>-1));
		
		foreach($detallevalesalidas_db as $detvale_db){
		    //disminuimos el stock fisico del articulo
		    if(!$this->Articulo->setActualizarStock($detvale_db['Detallevalesalida']['articulo_id'],$detvale_db['Detallevalesalida']['cantidad'],'RESTA','F')) 
		        return array('respuesta'=>false, 'mensaje'=>"ERROR AL ACTUALIZAR STOCK DE ARTICULO");
		    
		    //disminuimos el stock fisico del almacen
		    if(!$this->AlmacenesArticulo->setActualizarStock($valesalida['Valesalida']['almacen_id'],$detvale_db['Detallevalesalida']['articulo_id'],$detvale_db['Detallevalesalida']['cantidad'],'RESTA','F')) 
		        return array('respuesta'=>false, 'mensaje'=>"ERROR AL ACTUALIZAR STOCK DE ARTICULO/ALMACEN");
		        
		    //generamos el kardex
			$almacen_articulo = $this->AlmacenesArticulo->find('first',array('conditions'=>array('almacen_id'=>$valesalida['Valesalida']['almacen_id'],'articulo_id'=>$detvale_db['Detallevalesalida']['articulo_id']),'recursive'=>-1));
			$articulo = $this->Articulo->find('first',array('conditions'=>array('id'=>$detvale_db['Detallevalesalida']['articulo_id']),'recursive'=>-1));
			
			$kardex['Kardex'] = array('documento_id'=>$valesalida['Valesalida']['documento_id'],
			                            'almacenes_articulos_id'=>$almacen_articulo['AlmacenesArticulo']['id'],
			                            'salida'=>$detvale_db['Detallevalesalida']['cantidad'],
			                            'almacen_stock'=>$almacen_articulo['AlmacenesArticulo']['stock_fisico'],
			                            'articulo_stock'=>$articulo['Articulo']['stockfisico']);
			$this->Kardex->create();
			if(!$this->Kardex->save($kardex['Kardex']))  return array('respuesta'=>false, 'mensaje'=>'KARDEX NO ACTUALIZADO',$kardex,$articulo,$almacen_articulo); 
			
			unset($kardex); 
		}
		return array('respuesta'=>true, 'mensaje'=>"EL VALE SALIDA HA SIDO ENTREGADO", 'factura_id'=>$valesalida['Valesalida']['factura_id']);
    }
    
    
	/** GENERAMOS EL VALE SALIDA, 
	 * LUEGO PROCEDEMOS A ENTREGARLO TODO
	 */
	function setValesalida($factura_id,$almacen_id,$variables){
		app::import('Model','Detallefactura');  $this->Detallefactura = new Detallefactura();
		app::import('Model','Factura');  $this->Factura = new Factura();
		
		//recuperamos los detalles de la factura de los cuales se genero su vale
		$detallefacturas = $this->Detallefactura->getDetallesVale($factura_id,$almacen_id);
		
		//generamos el vale de salida 
		$respuesta = $this->setValesalidaPorFactura($detallefacturas,$factura_id,$variables);
		if(!$respuesta['respuesta'])  return $respuesta;
		
		$valesalida_id = $respuesta['Valesalida']['id'];
		
		//retiramos el stock fisico del vale salida y se genera el kardex
		$respuesta = $this->setKardexValesalida($valesalida_id,$variables);
		if(!$respuesta['respuesta'])  return $respuesta;
		
		//actualizamos el estado de la factura
		$respuesta = $this->Factura->setActualizarEstado($factura_id);
		if(!$respuesta['respuesta'])  return $respuesta;
		
		//recuperamos los datos del vale generado
		$conditions = array('Valesalida.id'=>$valesalida_id);
		$fields = array('Valesalida.id','Valesalida.numero');
		$valesalidas = $this->find('first',array('conditions'=>$conditions,'recursive'=>-1,'fields'=>$fields));
		if(empty($valesalidas))  return array('respuesta'=>false, 'mensaje'=>"EL VALE SALIDA NO HA SIDO GENERADO");
		
		$respuesta['numero'] = $valesalidas['Valesalida']['numero'];
		return $respuesta;
	}
	
	/** devuelve los insumos al stock_disponible del articulo, almacen y ponemos cantidades en cero - esto no afecta kardex
     * $valesalida_id : id del vale salida que se quiere reiniciar (anular)
     * return array('respuesta'=>false, 'mensaje'=>"MENSAJE");
     */
	/*
    function setReiniciarValesalida($valesalida_id){
		App::import('Model','Detallevalesalida');            $this->Detallevalesalida = new Detallevalesalida();
		App::import('Model','Articulo');                     $this->Articulo = new Articulo();
		App::import('Model','AlmacenesArticulo');            $this->AlmacenesArticulo = new AlmacenesArticulo();
		
        $conditions = array('Valesalida.id'=>$valesalida_id, 'Valesalida.valesalidaestado_id'=>1);
        $valesalida = $this->find('first',array('conditions'=>$conditions,'fields'=>array('Valesalida.id','Valesalida.almacen_id')));
        if(empty($valesalida)) return array('respuesta'=>false, 'mensaje'=>"ERROR EL VALE SALIDA NO EXISTE");
        
        //cambiamos el estado del vale salida
        $valesalida['Valesalida']['valesalidaestado_id'] = 3;  //anulado ya que un vale salida generado ya tiene un numero de vale
        if(!$this->save($valesalida['Valesalida']))  return array('respuesta'=>false, 'mensaje'=>"VALE SALIDA NO ANULADO");
        
        //devolvemos los insumos a almacen del vale salida
        $conditions = array('Detallevalesalida.valesalida_id'=>$valesalida_id,'Detallevalesalida.estado_id'=>1);
		$detallevalesalidas_db = $this->Detallevalesalida->find('all',array('conditions'=>$conditions,'recursive'=>-1));
		
		foreach($detallevalesalidas_db as $detvale_db){
		    //devolvemos el stock disponible del almacen
			if(!$this->AlmacenesArticulo->setActualizarStock($valesalida['Valesalida']['almacen_id'],$detvale_db['Detallevalesalida']['articulo_id'],$detvale_db['Detallevalesalida']['cantidad'],'SUMA','D'))
			    return array('respuesta'=>false, 'mensaje'=>'STOCK NO ACTUALIZADO');
    			
		    //devolvemos el stock disponible del articulo
		    if(!$this->Articulo->setActualizarStock($detvale_db['Detallevalesalida']['articulo_id'],$detvale_db['Detallevalesalida']['cantidad'],'SUMA','D'))
    			return array('respuesta'=>false, 'mensaje'=>'STOCK NO ACTUALIZADO');
    			    
		    //Reiniciamos el detalle del vale de salida
		    $detvale_db['Detallevalesalida']['cantidad'] = 0;
		    $detvale_db['Detallevalesalida']['estado_id'] = 2;
		    if(!$this->Detallevalesalida->save($detvale_db['Detallevalesalida']))
		        return array('respuesta'=>false, 'mensaje'=>"ERROR REINICIAR DETALLE VALE SALIDA");
		    
		}
		return array('respuesta'=>true, 'mensaje'=>"EL VALE SALIDA HA SIDO DEVUELTOS/REINICIADOS");
    }
    */
    
    
    /** Nos entrega los datos del vale salida **/
    function getValesalida($vale_id){
        $fields = array('Valesalida.numero','Valesalida.valesalidaestado_id','Factura.numero'
                        ,'Factura.created','Almacen.codigo','Usuario.appaterno','Usuario.nombres');
        $conditions = array('Valesalida.id'=>$vale_id);
        return $this->find('first',array('conditions'=>$conditions,'fields'=>$fields));
    }
}